package cn.sxgan.common.utils.file;

import cn.sxgan.common.config.properties.ZoeyConfig;
import cn.sxgan.common.consts.FilePathConst;
import cn.sxgan.common.utils.DateUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

import static cn.sxgan.common.utils.file.FileUtils.getExtension;


/**
 * @Description: 文件上传工具类
 * @Author: sxgan
 * @Date: 24/9/18 10:41
 * @Version: 1.0
 **/
public class FileUploadUtils {
    
    /**
     * 默认的文件名最大长度 100
     */
    public static final int DEFAULT_FILE_NAME_LENGTH = 100;
    
    /**
     * 默认上传的地址
     */
    private static String defaultBaseDir = ZoeyConfig.getProfile();
    
    public static void setDefaultBaseDir(String defaultBaseDir) {
        FileUploadUtils.defaultBaseDir = defaultBaseDir;
    }
    
    public static String getDefaultBaseDir() {
        return defaultBaseDir;
    }
    
    /**
     * 以默认配置进行文件上传
     *
     * @param file 上传的文件
     * @return 文件名称
     * @throws IOException IO异常
     */
    public static String upload(MultipartFile file) throws IOException {
        try {
            if (file == null || file.getSize() == 0 || file.getContentType() == null) {
                throw new RuntimeException("文件不能为空");
            }
            return upload(getDefaultBaseDir(), file, MediaTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        } catch (Exception e) {
            throw new IOException(e.getMessage(), e);
        }
    }
    
    /**
     * 以默认配置进行文件上传
     *
     * @param file   上传的文件
     * @param reName 重命名
     * @return 文件名称
     * @throws IOException IO异常
     */
    public static String upload(MultipartFile file, String reName) throws IOException {
        try {
            if (file == null || file.getSize() == 0 || file.getContentType() == null) {
                throw new RuntimeException("文件不能为空");
            }
            
            String path = FileUtils.createDir(FilePathConst.ROOT_DIR + getDefaultBaseDir() + "/" + DateUtils.datePath());
            return upload(path + "/" + reName, file, MediaTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        } catch (Exception e) {
            throw new IOException(e.getMessage(), e);
        }
    }
    
    /**
     * 根据文件路径上传
     *
     * @param baseDir 相对应用的基目录
     * @param file    上传的文件
     * @return 文件名称
     * @throws IOException IO异常
     */
    public static String upload(String baseDir, MultipartFile file) throws IOException {
        try {
            String originalFilename = file.getOriginalFilename();
            return upload(baseDir + "/" + originalFilename, file, MediaTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        } catch (Exception e) {
            throw new IOException(e.getMessage(), e);
        }
    }
    
    /**
     * @param filePath         上传的文件相对目录
     * @param file             文件
     * @param allowedExtension 运行的扩展
     * @return 文件名
     * @throws IOException IO异常
     */
    public static String upload(String filePath, MultipartFile file, String[] allowedExtension) throws IOException {
        // 上传目录
        File saveFile = new File(filePath);
        if (!saveFile.exists()) {
            saveFile.createNewFile();
        }
        file.transferTo(saveFile);
        return filePath;
    }
    //
    // public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException {
    //     File desc = new File(uploadDir + File.separator + fileName);
    //
    //     if (!desc.exists()) {
    //         if (!desc.getParentFile().exists()) {
    //             desc.getParentFile().mkdirs();
    //         }
    //     }
    //     return desc;
    // }
    //
    // public static final String getPathFileName(String uploadDir, String fileName) throws IOException {
    //     int dirLastIndex = ZoeyConfig.getProfile().length() + 1;
    //     String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
    //     return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
    // }
    //
    
    /**
     * 文件大小校验
     *
     * @param file 上传的文件
     */
    public static void assertAllowed(MultipartFile file, String[] allowedExtension) {
        String extension = getExtension(file);
        if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) {
            throw new RuntimeException("不是允许上传的文件类型");
        }
    }
    //
    
    /**
     * 判断MIME类型是否是允许的MIME类型
     *
     * @param extension
     * @param allowedExtension
     * @return
     */
    public static boolean isAllowedExtension(String extension, String[] allowedExtension) {
        for (String str : allowedExtension) {
            if (str.equalsIgnoreCase(extension)) {
                return true;
            }
        }
        return false;
    }
}